什么是 Ansible?Ansible 是一款功能強(qiáng)大且易于使用的現(xiàn)代應(yīng)用程序部署和配置管理工具。它使得從單個(gè)控制節(jié)點(diǎn)處理數(shù)以千計(jì)的遠(yuǎn)程服務(wù)器(也稱為受管節(jié)點(diǎn))變得容易。Ansible 允許您輕松地重現(xiàn)配置環(huán)境,并避免您登錄到單個(gè)服務(wù)器并一臺(tái)一臺(tái)地配置它們。
即使在 Ansible 中跟蹤數(shù)以千計(jì)的遠(yuǎn)程服務(wù)器也可能變得很麻煩,因此了解如何使用稱為清單文件的特殊文件對(duì)托管節(jié)點(diǎn)進(jìn)行分組和定位至關(guān)重要。
什么是 Ansible 庫存文件?
Ansible 清單文件允許系統(tǒng)管理員跟蹤他們管理的遠(yuǎn)程系統(tǒng)。默認(rèn)清單文件稱為hosts文件,位于/etc/ansible目錄中。這是指定所有受管遠(yuǎn)程節(jié)點(diǎn)的地方。
Ansible 還使您可以靈活地在控制節(jié)點(diǎn)上的首選位置創(chuàng)建自定義清單文件以滿足您的偏好。當(dāng)您擁有復(fù)雜的環(huán)境并且需要將受管節(jié)點(diǎn)隔離到單獨(dú)的清單文件而不是將它們?nèi)糠旁趆osts文件中時(shí),這是理想的選擇。
在本指南中,您將安裝 Ansible 并在控制節(jié)點(diǎn)上設(shè)置自定義清單文件。
先決條件
為了演示如何在清單文件中定義遠(yuǎn)程服務(wù)器,我們將使用以下設(shè)置,其中所有服務(wù)器都部署了 Ubuntu 20.04 操作系統(tǒng):
Ansible 控制節(jié)點(diǎn):這是安裝 Ansible 的服務(wù)器。它用于通過 SSH 連接到您的托管節(jié)點(diǎn)并管理它們。
托管節(jié)點(diǎn):這些是將從 Ansible 控制節(jié)點(diǎn)管理的遠(yuǎn)程節(jié)點(diǎn):
節(jié)點(diǎn) 1:?198.148.118.68
節(jié)點(diǎn) 2:?198.148.118.129
我們的小型實(shí)驗(yàn)室設(shè)置足以說明您如何使用 Ansible 清單文件來管理您的遠(yuǎn)程系統(tǒng)。但是,您可以擁有的托管節(jié)點(diǎn)的數(shù)量沒有限制。
在 Ubuntu 20.04 上安裝 Ansible
我們的第一步是在控制節(jié)點(diǎn)上安裝 Ansible。因此,通過 SSH 或使用免費(fèi)的 SSH 客戶端(如PuTTY?)登錄到您的控制節(jié)點(diǎn)。
登錄后,通過運(yùn)行以下命令更新系統(tǒng)包列表。-y 選項(xiàng)自動(dòng)假定“是”作為對(duì)所有命令行提示的回答。
sudo apt update
接下來,安裝 Ansible:
sudo apt install -y ansible
這將安裝 Ansible 和許多其他附加包和依賴項(xiàng)。完成后,通過檢查 Ansible 的版本來驗(yàn)證是否安裝了 Ansible:
ansible –-version
下面的輸出證明我們已經(jīng)成功安裝了 Ansible 2.9.6 版本。
如前所述,默認(rèn)清單文件位于 /etc/ansible/hosts。使用首選命令行編輯器打開文件后,您將看到一些關(guān)于預(yù)期內(nèi)容的基本指南。
sudo nano /etc/ansible/hosts
# This is the default ansible 'hosts' file. # # It should live in /etc/ansible/hosts # # - Comments begin with the '#' character # - Blank lines are ignored # - Groups of hosts are delimited by [header] elements # - You can enter hostnames or ip addresses # - A hostname/ip can be a member of multiple groups # Ex 1: Ungrouped hosts, specify before any group headers: ## green.example.com ## blue.example.com ## 192.168.100.1 ## 192.168.100.10 # Ex 2: A collection of hosts belonging to the 'webservers' group: ## [webservers] ## alpha.example.org ## beta.example.org ## 192.168.1.100 ## 192.168.1.110
默認(rèn)情況下,所有條目都被注釋掉并且沒有指定主機(jī)。在下一步中,您將連接到遠(yuǎn)程主機(jī)并創(chuàng)建自定義清單文件。
設(shè)置無密碼 SSH 連接
Ansible 是一種無代理部署工具,它使用 SSH 協(xié)議與遠(yuǎn)程節(jié)點(diǎn)進(jìn)行通信。為了無縫地實(shí)現(xiàn)這一點(diǎn),我們需要采取額外的步驟,在 Ansible 控制節(jié)點(diǎn)和遠(yuǎn)程系統(tǒng)之間配置一個(gè)無密碼的 SSH 連接。
首先,使用以下命令生成 SSH 密鑰對(duì):
ssh-keygen
它將創(chuàng)建一個(gè) SSH 密鑰對(duì),其中包含存儲(chǔ)在您主目錄的 .ssh/ 文件夾中的公鑰和私鑰。
私鑰應(yīng)保留在 Ansible 控制節(jié)點(diǎn)上,絕不能泄露或與任何人共享,以避免中間人攻擊等安全漏洞。另一方面,您可以輕松地與您選擇的任何遠(yuǎn)程系統(tǒng)共享公鑰。
要成功配置無密碼 SSH 連接,您需要將公鑰復(fù)制到遠(yuǎn)程節(jié)點(diǎn)。ssh-copy-id您可以使用所示語法中的命令輕松執(zhí)行此操作:
ssh-copy-id user@server-ip-address
在我們的例子中,命令將是:
ssh-copy-id root@198.148.118.68
出現(xiàn)提示時(shí)輸入遠(yuǎn)程系統(tǒng)的密碼,然后按 ENTER 鍵將公鑰復(fù)制到服務(wù)器。
為了驗(yàn)證我們是否可以在沒有密碼身份驗(yàn)證的情況下登錄到遠(yuǎn)程系統(tǒng),我們將嘗試通過 SSH 登錄,方法是證明用戶名后跟“@”,然后是遠(yuǎn)程節(jié)點(diǎn)的 IP 地址。
ssh root@198.148.118.68
下面提供的代碼片段是對(duì)我們剛剛在沒有密碼的情況下登錄到遠(yuǎn)程 node1 的確認(rèn)。
公鑰保存在~/.ssh/authorized_keys遠(yuǎn)程節(jié)點(diǎn)的文件中。
您可以仔細(xì)檢查它是否存在:
cat ~/.ssh/authorized_keys
對(duì)所有節(jié)點(diǎn)重復(fù)相同的過程,并確保您可以在沒有密碼身份驗(yàn)證的情況下通過 SSH 連接到它們。
創(chuàng)建自定義庫存文件
Ansible 使用位于的默認(rèn)清單文件來引用托管節(jié)點(diǎn),除非您通過該選項(xiàng)/etc/ansible/hosts指定自定義清單文件。-i
默認(rèn)的清單文件工作得很好。實(shí)際上,您可以使用遠(yuǎn)程節(jié)點(diǎn)的 IP 地址將其放入其中,如下所示:
198.148.118.68 198.148.118.129
然后,您可以在遠(yuǎn)程節(jié)點(diǎn)上執(zhí)行 ping 模塊,而無需明確指定遠(yuǎn)程主機(jī):
sudo ansible -m ping all
當(dāng)然,這沒有任何問題,但是當(dāng)面對(duì)不同項(xiàng)目下的多個(gè)托管節(jié)點(diǎn)時(shí),最佳做法是為每個(gè)項(xiàng)目創(chuàng)建單獨(dú)的清單文件。通過這種方式,您將促進(jìn)資源跟蹤并更輕松地與其他系統(tǒng)管理員協(xié)作,而無需讓每個(gè)人都糾結(jié)在一個(gè)hosts文件中。
現(xiàn)在,讓我們創(chuàng)建一個(gè)自定義清單文件。為此,您應(yīng)該首先創(chuàng)建一個(gè)項(xiàng)目目錄并導(dǎo)航到其中:
mkdir project_dir && cd project_dir
接下來,創(chuàng)建一個(gè)簡(jiǎn)單的文本文件。您可以給它任意名稱:
nano inventory
然后使用它們的 IP 地址每行列出您的托管節(jié)點(diǎn):
198.148.118.68 198.148.118.129
保存更改并退出文件。ansible-inventory現(xiàn)在您可以使用命令驗(yàn)證托管主機(jī)。請(qǐng)注意,使用該-i選項(xiàng)時(shí)必須引用清單文件的完整路徑。
ansible-inventory -i project_dir/inventory --list
從這里,您可以使用自定義清單文件在托管主機(jī)上執(zhí)行劇本或 ping 模塊:
sudo ansible -i project_dir/inventory -m ping all
將節(jié)點(diǎn)組織成組和子組
為了更清晰的清單文件和更輕松地管理您的受管節(jié)點(diǎn),通常建議將它們組織成組和子組。
一臺(tái)主機(jī)可以屬于一個(gè)或多個(gè)組。在下面的示例中,我們webservers以 INI 格式將 2 臺(tái)主機(jī)分組到該組下。
[webservers] 198.148.118.68 198.148.118.129
下面的清單文件更好地說明了多臺(tái)服務(wù)器被分為不同的組,例如webservers,load_balancers和db_servers.
[webservers] 198.148.118.68 198.148.118.129 198.148.118.150 198.148.118.175 [load_balancers] 198.148.118.100 198.148.118.200 [db_servers] 198.148.118.50 198.148.118.60
再次運(yùn)行ansible-inventory命令,您應(yīng)該會(huì)看到與此處類似的安排:
ansible-inventory -i project_dir/inventory --list
您還可以將多個(gè)組定義為“父”組下的“子”組。在這種情況下,“父”組成為元組。以下是如何使用元組重新組織以前的清單的說明:
[childgroup1] node1 node2 [childgroup2] node3 node4 [parent1:children] childgroup1 childgroup2
考慮到這一點(diǎn),我們可以重新組織我們的庫存,如下所示。
[webservers_miami] 198.148.118.68 198.148.118.129 [webservers_virginia] 198.148.118.150 198.148.118.175 [load_balancer_ohio] 198.148.118.100 [load_balancer_texas] 198.148.118.200 [db_server_miami] 198.148.118.50 [db_server_virginia] 198.148.118.60 [webservers:children] webservers_miami webservers_virginia [load_balancers:children] load_balancer_ohio load_balancer_texas [db_servers:children] db_server_miami db_server_virginia
再次,您可以按如下方式驗(yàn)證庫存清單:
ansible-inventory -i project_dir/inventory --list
這樣的安排可以幫助您使用劇本來定位較小的服務(wù)器組,而不是一次定位所有節(jié)點(diǎn)。例如,您可以在[webservers_miami]子組中執(zhí)行 ping 模塊,如下所示:
sudo ansible -i project_dir/inventory -m ping webservers_miami
使用模式來定位命令的執(zhí)行
使用 Ansible 運(yùn)行劇本或臨時(shí)命令時(shí),您需要提供通常在清單文件中定義的目標(biāo)。模式可以靈活地定位清單文件中的特定主機(jī)或組。它們支持通配符、正則表達(dá)式等等。
為了演示如何使用模式,請(qǐng)考慮下面的清單文件:
[webservers] 198.148.118.68 198.148.118.129 198.148.118.160 [db_servers] 198.148.118.55 198.148.118.110 [staging] 198.148.118.160 198.148.118.110 [production] 198.148.118.68 198.148.118.129 198.148.118.55
假設(shè)您要執(zhí)行一個(gè)僅針對(duì)生產(chǎn)環(huán)境中運(yùn)行的 Web 服務(wù)器的臨時(shí)命令。在此清單中,只有兩個(gè)網(wǎng)絡(luò)服務(wù)器符合此條件:198.148.118.68和198.148.118.129。
您可以簡(jiǎn)單地使用以下匹配模式,而不是分別針對(duì)兩個(gè)目標(biāo)主機(jī):
sudo ansible webservers:\&production -m ping
& 符號(hào) - & - 表示邏輯運(yùn)算 AND。這意味著有效的主機(jī)必須在兩個(gè)組中,即webservers和production。由于這是一個(gè)臨時(shí)命令,我們需要\在命令中插入轉(zhuǎn)義符。
要定位webservers組中但不在 中的主機(jī)production,請(qǐng)使用以下模式:
sudo ansible webservers:\!production -m ping
此處,!符號(hào)表示邏輯運(yùn)算符 NOT,它表示有效主機(jī)不得包含在production組中。再一次,我們需要包含\轉(zhuǎn)義字符,因?yàn)槲覀冋谶\(yùn)行一個(gè)必須由 shell 解釋的臨時(shí)命令。
下表提供了在使用 Ansible 自動(dòng)化工具運(yùn)行臨時(shí)命令和劇本時(shí)可以使用的其他模式。
圖案 | 目標(biāo) |
---|---|
all | 清單文件中的所有目標(biāo) |
node1 | 單個(gè)節(jié)點(diǎn)或主機(jī) (?node1) |
node1:node2 | 和node1_node2 |
group1 | group1僅適用于所有主機(jī) |
group1:group2 | 適用于所有g(shù)roup1主機(jī)group2 |
group1:\&group2 | 兩者兼有的主機(jī)或group1服務(wù)器group2 |
group1:\&group2 | 主機(jī)或服務(wù)器在group1但不在group2 |
配置主機(jī)別名
別名是引用受管節(jié)點(diǎn)的一種簡(jiǎn)單方法。就像昵稱一樣,它們可以幫助您輕松識(shí)別您的資源,而無需在運(yùn)行劇本時(shí)回憶復(fù)雜的名稱。
要定義別名,只需指定一個(gè)別名,后跟一個(gè)與遠(yuǎn)程主機(jī)的主機(jī)名或 IP 相對(duì)應(yīng)的變量名。
alias variable_name
例如:
primary_server ansible_host=198.148.118.68` secondary_server ansible_host=198.148.118.129`
然后驗(yàn)證清單列表以檢查節(jié)點(diǎn)是否被別名引用。
ansible-inventory -i project_dir/inventory --list
從輸出中我們可以看到服務(wù)器現(xiàn)在被它們的別名所引用。您還可以通過使用別名引用節(jié)點(diǎn)來運(yùn)行臨時(shí)命令:
sudo ansible -i project_dir/inventory -m ping primary_server
配置變量名稱
在 Ansible 中,變量用于處理托管主機(jī)之間的差異。使用變量,您可以在執(zhí)行劇本或臨時(shí)命令時(shí)表示系統(tǒng)之間的差異。例如,在上一節(jié)中,我們使用了ansible_host簡(jiǎn)單地告訴 Ansible 在哪里搜索托管節(jié)點(diǎn)的 IP 地址的變量。
在清單文件中,您可以使用變量來定義主機(jī)名、連接類型、端口等。在下面的示例中,我們進(jìn)一步定義了用于啟動(dòng)到節(jié)點(diǎn)的遠(yuǎn)程連接的用戶。
在這種情況下,我們有兩個(gè)變量:ansible_host指定主機(jī)的 IP,以及ansible_user指定用于連接遠(yuǎn)程主機(jī)的用戶。
server01 ansible_host=198.148.118.68 ansible_user=root server02 ansible_host=198.148.118.129 ansible_user=user
此外,您還可以創(chuàng)建主機(jī)組并在組級(jí)別具有變量。在這個(gè)例子中,我們有兩個(gè)獨(dú)立的變量組——[webservers_a:vars]它們[webservers_b:vars]定義了連接到被管節(jié)點(diǎn)的用戶。
[webservers_a] server01 ansible_host=198.148.118.68 [webservers_b] server02 ansible_host=198.148.118.129 [webservers_a:vars] ansible_user=root [webservers_b:vars] ansible_user=user
結(jié)論
在本教程中,我們深入研究了 Ansible 清單,并演示了如何將托管主機(jī)組織成組和子組。然后我們更進(jìn)一步,演示了如何使用模式來定位特定的主機(jī)組,觸及別名,最后用允許某些關(guān)鍵參數(shù)因主機(jī)而異的變量結(jié)束。